home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 111_01 / tr1.c < prev    next >
Text File  |  1985-08-19  |  2KB  |  73 lines

  1. /*
  2. HEADER:        ;
  3. TITLE:        Squeezer;
  4. DESCRIPTION:    "Auxiliary file for the SQ.C and USQ.C package.
  5.         See SQUEEZER.DOC.";
  6. SYSTEM:        CP/M-80;
  7. FILENAME:    TR1.C;
  8. SEE-ALSO:    SQUEEZER.DOC;
  9. AUTHORS:    Dick Greenlaw;
  10. COMPILERS:    BDS C;
  11. */
  12. #include <bdscio.h>
  13. #include <dio.h>
  14. #include "sqcom.h"
  15. #include "sq.h"
  16.  
  17. /* First translation - encoding of repeated characters
  18.  * The code is byte for byte pass through except that
  19.  * DLE is encoded as DLE, zero and repeated byte values
  20.  * are encoded as value, DLE, count for count >= 3.
  21.  */
  22.  
  23. init_ncr()    /*initialize getcnr() */
  24. {
  25.     state = NOHIST;
  26. }
  27.  
  28. int
  29. getcnr(iob)
  30. struct _buf *iob;
  31. {
  32.     switch(state) {
  33.     case NOHIST:
  34.         /* No relevant history */
  35.         state = SENTCHAR;
  36.         return lastchar = getc_crc(iob);
  37.     case SENTCHAR:
  38.         /* Lastchar is set, need lookahead */
  39.         switch(lastchar) {
  40.         case DLE:
  41.             state = NOHIST;
  42.             return 0;    /* indicates DLE was the data */
  43.         case EOF:
  44.             return EOF;
  45.         default:
  46.             for(likect = 1; (newchar = getc_crc(iob)) == lastchar && likect < 255; ++likect)
  47.                 ;
  48.             switch(likect) {
  49.             case 1:
  50.                 return lastchar = newchar;
  51.             case 2:
  52.                 /* just pass through */
  53.                 state = SENDNEWC;
  54.                 return lastchar;
  55.             default:
  56.                 state = SENDCNT;
  57.                 return DLE;
  58.             }
  59.         }
  60.     case SENDNEWC:
  61.         /* Previous sequence complete, newchar set */
  62.         state = SENTCHAR;
  63.         return lastchar = newchar;
  64.     case SENDCNT:
  65.         /* Sent DLE for repeat sequence, send count */
  66.         state = SENDNEWC;
  67.         return likect;
  68.     default:
  69.         puts("Bug - bad state\n");
  70.         exit(1);
  71.     }
  72. }
  73.